# l1 = [1,2,3......100]
# l1 = []
# for i in range(1,101):
#     l1.append(i)
# print(l1)

# 列表推导式
l1 = [i for i in range(1, 101)]
# print(l1)

# 两种构建方式：
# 1.循环模式： [变量(加工后的变量) for 变量 in iterable]
# 2.筛选模式： [变量(加工后的变量) for 变量 in iterable if 条件]

# 循环模式：
# 将10以内所有整数的平方写入列表。
# print([i**2 for i in range(1, 11)])
# 100以内所有的偶数写入列表.
# print([i for i in range(2, 101, 2)])
# 从python1期到python100期写入列表list
# print([f'python{i}期' for i in range(1, 101)])

# 2.筛选模式：
# print([i for i in range(1, 101) if i > 49])
# 三十以内可以被三整除的数。
# print([i for i in range(1, 31) if i % 3 == 0])
# 过滤掉长度小于3的字符串列表，并将剩下的转换成大写字母
# l1 = ['barry', 'fdsaf', 'alex', 'sb', 'ab']
# print([i.upper() for i in l1 if len(i) > 3])
# 找到嵌套列表中名字含有两个‘e’的所有名字（有难度）
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
# l1 = []
# for i in names:
#     for j in i:
#         if j.count('e') > 1:
#             l1.append(j)
# print(l1)

print([j for i in names for j in i if j.count('e') > 1])

# 列表推导式的优缺点：
# 优点：
    # 1， 简单，快捷，装b。
# 缺点：
    # 2. 可读性不高，不好排错。
# 慎用，不要入迷。

# 生成器表达式：
# 与列表推导式几乎一模一样。
# 循环模式，筛选模式。
# obj = (i for i in range(1, 11))
# # print(obj)
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # 如何触发生成器（迭代器）取值？
# #　1. next(obj)
# # 2. for 循环
# # for i in obj:
# #     print(i)
# # 3. 数据转化
# print(list(obj))

# 生成器表达式：生成器 节省内存。



# 字典推导式，集合推导式：  两种模式： 循环模式，筛选模式
l1 = ['小潘', '怼怼哥','西门大官人', '小泽ml亚']
# {0： '小潘', 1： '怼怼哥', 2: '西门大官人'}
# dic = {}
# for index in range(len(l1)):
#     dic[index] = l1[index]
# print(dic)
# print({i:l1[i] for i in range(len(l1))})


# 1~100

# print({i for i in range(1, 101)})